// 基础类型
(function () {
    console.log("测试");
    // 布尔类型     --->boolean
    // let 变量名：数据类型 = 值
    var flag = true;
    console.log(flag);
    //数字类型      --->number
    var a1 = 10; //十进制
    var a2 = 10; //二进制
    var a3 = 10; //八进制
    var a4 = 0xa; //十六进制
    console.log(a1);
    console.log(a2);
    console.log(a3);
    console.log(a4);
    //字符串类型        -->string
    var str1 = "床前明月光";
    var str2 = "小明去开窗";
    var str3 = "遇到一道光";
    var str4 = "牙齿掉光光";
    console.log(str1 + "," + str2 + "," + str3 + "," + str4 + "12312");
    // 字符串和数字之间能够一起拼接
    var str5 = "成为前端工程师中的巴菲特,年化率为";
    var num = 1000;
    console.log(str5 + num + "%");
    //总结：ts中变量一开始是什么类型，那么后期赋值的时候，只能用这个类型的数据，是不允许用其他类型的数据赋值给当前的这个变量中
    //如：let str:string ="真香" str=100 , 没有武德(不允许)
    console.log("----------");
    var und = undefined;
    var nll = null;
    console.log(und);
    console.log(nll);
    //undefined 和 null 都可以作为  其他类型的子类型 把undefined 和 null 赋值给其他类型的变量的，如：number；类型的变量
    // let num2:number = undefined
    // let num2:number = null
    // console.log(num2)
    console.log("===============");
    //数组类型
    //数组定义方式1
    //let 变量名：数据类型[] = [值1,值2,值3,值4]
    var arr1 = [10, 20, 30, 40, 55];
    console.log(arr1);
    //数组；定义方式2：泛型的写法
    //语法：let 变量名:Array<数据类型> =  [值1,值2,值3,值4]
    var arr2 = [1000, 200, 300];
    console.log(arr2);
    //注意问题：数组定义后，里面的数据的类型必须和定义数组的时候的类型一致，否则有错误的提示信息，也不会编译通过的
    //元组类型:在定义数组的时候，类型和数据的个数一开始就已经限定了
    var arr3 = ['小小浩', 100, true];
    console.log(arr3);
    //注意问题：元组类型在使用的时候，数据类型的位置和数据的个数，应该和在定义元组的的时候的数据类型及位置应该是一致的
    console.log(arr3[0].split(''));
    console.log(arr3[1].toFixed(2));
    console.log("==========");
    //枚举类型
    var Color;
    (function (Color) {
        Color[Color["red"] = 1] = "red";
        Color[Color["green"] = 2] = "green";
        Color[Color["blue"] = 3] = "blue";
    })(Color || (Color = {}));
    //定义一个Color的枚举类型的变量来接收枚举的值
    var color = Color.red;
    console.log(color);
    console.log(Color.red, Color.green, Color.blue);
    console.log(Color[2]);
    //小例子,枚举中的元素可以是中文的数据值，但是不推荐
    // enum Gender{
    //     男,
    //     女
    // }
    // console.log(Gender.女)
    console.log("============");
    //any类型
    // let str:any = 100
    // str = "年少不知富婆好"
    // console.log(str)
    //当一个数组中要存储多个数据，个数不确定，类型不确定，此时也可以使用any类型来定义数组
    var arr = [100, "年少不知软饭香，错把青春倒插秧", true];
    console.log(arr);
    //这种情况下也没有错误的提示信息，any类型有有点，也有缺点
    // console.log(arr[1].split(""))
    //void类型,在函数声明的时候，小括号的后面使用:void,代表的是该函数没有任何的返回值
    function showMsg() {
        console.log('只要富婆把握住，连夜搬家大别墅');
        // return
        // return undefined
        return null;
    }
    showMsg();
    console.log(showMsg());
    //定义void类型的变量，可以接收一个undefined的值，但是意义不大
    console.log("============");
    //object类型
    //定义一个函数，参数是object类型，返回值也是object类型
    function getObj(obj) {
        console.log(obj);
        return {
            name: "卡卡罗特",
            age: 27
        };
    }
    // console.log(getObj({name:"小小浩",age:18}))
    // console.log(getObj(123))     //错误的
    // console.log(getObj(new String('123')))
    console.log(getObj(String));
    console.log("============");
    // 联合类型（Union Types）表示取值可以为多种类型中的一种
    // 需求1: 定义一个一个函数得到一个数字或字符串值的字符串形式值
    // function getString(str:number|string){
    //     return str.toString()
    // }
    // console.log(getString("sfdsadf"))
    //需求2: 定义一个一个函数得到一个数字或字符串值的长度
    //  类型断言 通过类型断言这种方式可以告诉编译器，“相信我，我知道自己在干什么”。
    //  类型断言的语法方式1：<类型>变量名
    //  类型断言的语法方式2：值 as 类型
    function getString(str) {
        // return str.toString().length
        //如果str本身就是string类型，就没有必要调用toString(方法的
        if (str.length) {
            //str.length存在吗？如果存在就说明str是string类型
            // return (<string>str).length
            return str.length;
        }
        else {
            //此时说明str是number类型
            return str.toString().length;
        }
    }
    console.log(getString(123456));
    console.log(getString("sdtg"));
    // 类型推断: TS会在没有明确的指定类型的时候推测出一个类型
    // let txt = 100       //number类型
    // txt = "123" //错误
    // console.log(txt)
    var txt2; // any类型
    txt2 = 100;
    txt2 = "123"; //成功
    console.log(txt2);
    console.log("============");
})();
